/*
 * ExchangeScanner类，该类的主要功能是执行定时循环扫描，该类对象的定义发生在mainwindow的构造函数里，所以
 * 该类最初的依附线程是主线程，后通过moveToThread改变依附性，进入子线程
 *
 * FIELDS:
 *    TIMER:
 *        1. scanTimer(QTimer*) 用于扫描的定时器，定位1秒执行一次，即QT::timeout = 1000
 *
 *     database connection:
 *         1. multithreadCalculationSqliteConnection(QSqlDatabase)    用于子线程连接sqlite数据库
 *         2. multithreadCalculationSqlserverConnection(QSqlDatabase)    用于子线程连接sqlserver数据库
 *
 *     store exchange infomation:
 *         1. exchangeTagPropertyMap(QMap<QString, ExchangeTagEntity*>)    用于存储交换信号内容，后续用来更新发现交换信号=1
 *
 *     others:
 *         1. exchangeTagListString(QString)    用于进行交换信号扫描的部分拼接字符串，
 *                                                                  处理后内容："DI1_14, DI1_15, DI2_14, DI2_15"，用于后续查询
 *         2. exchangeTableNameInSqlServer(QString)    这个对应处于对应时间数据库的JHX_DATA表的名称，
 *                                                                                  比如Data202207下的JHX_DATA表
 *         3. exchangeTagTimeCycleMap(QMap<QString, QList<QTime>>)    交换信号的时间节点map，
 *                                                                                                             这个map里存放每个交换信号的时间点信息，
 *                                                                                                             用来与currentTime做对比用以触发sql server查询
 *
 * MEMBER FUNCTIONS:
 *
 *         void startScan();   开始扫描，内部定义定时器，定义timeout信号，启动定时器
 *         void scan();    扫描函数，内部定义信号槽，连接扫描动作无触发，或触发计算
 *         void stopScan();    停止扫描函数，负责接收到子线程销毁信号时，销毁定时器
 *
 *         void connectSqlite();    为扫描线程连接sqlite数据库，private，仅在constructor里被调用
 *         void connectSqlServer();    为扫描线程连接sql server数据库，private，仅在constructor里被调用
 *         void generateExchangeTagCycleMap();    为扫描线程从sqlite数据库读取交换信号的时间表格，用于在
 *                                                                        currentTime做对比，触发交换信号计算，private，在startScan里
 *                                                                        被执行在timer->start()之前
*/

#ifndef EXCHANGESCANNER_H
#define EXCHANGESCANNER_H

#include "exchangetagentity.h"

#include <QObject>
#include <QTimer>
#include <QSqlDatabase>
#include <QList>
#include <QDateTime>

class ExchangeScanner : public QObject
{
    Q_OBJECT
public:
    explicit ExchangeScanner(QObject *parent = nullptr);
    ~ExchangeScanner();

public slots:
    /*
     * 这个函数内部
    */
    void startScan();
    void scan();
    void stopScan();

signals:
private:

    void connectSqlite();
    void connectSqlServer();

    /*这个函数从sqlite 交换时间表里读取将设定交换时间hold在app内*/
    void generateExchangeTagCycleMap();

    /*
     * 这是扫描的定时器，暂时设定为1秒，并且是阻塞的，就行，
    */
    QTimer * scanTimer;

    // 计算线程里的sqlite连接对象
    QSqlDatabase multithreadCalculationSqliteConnection;

    // 计算线程里的sql server连接对象
    QSqlDatabase multithreadCalculationSqlserverConnection;

    // 存储交换信息的数据结构
    QMap<QString, ExchangeTagEntity*> exchangeTagPropertyMap;

    // sql server数据库的表格
    QString exchangeTableNameInSqlServer;

    // 交换信号sql查询拼接字符串
    QString exchangeTagListString;

    // 交换信号的时间节点map，这个map里存放每个交换信号的时间点信息，用来与currentTime做对比用以触发sql server查询
    QMap<QString, QList<QTime>> exchangeTagTimeCycleMap;
};

#endif // EXCHANGESCANNER_H
